// 代理模式

package proxy

import "fmt"

// 定义接口，但外部不可见
type painter interface {
	init()
	drawCircle()
}

// 定义画家继承接口，同样外部不可见
type painterA struct {
	painter
}

// 定义代理类，封装了painterA
type PainterProxy struct {
	a painterA
}

func (p *painterA) init() {
	fmt.Println("painterA init")
}

func (p *painterA) drawCircle() {
	fmt.Println("painterA DrawCircle")
}

// 代理类处理了初始化，但不修改painterA的实现
func (p *PainterProxy) DrawCircle() {
	if p.a.painter == nil {
		p.a = painterA{}
		p.a.init()
	}
	p.a.drawCircle()
}

/*
func main() {
	// 使用代理类不关心内部painter实现，并且不用关心是否需要初始化
	p := PainterProxy{}
	p.DrawCircle()
}
*/
